//package org.apache.hadoop.hdfs;
//
//import java.io.FileNotFoundException;
//import java.io.IOException;
//import java.util.ArrayList;
//
//import org.apache.hadoop.fs.FileStatus;
//import org.apache.hadoop.fs.Path;
//import org.apache.hadoop.hdfs.protocol.DirectoryListing;
//import org.apache.hadoop.hdfs.protocol.HdfsFileStatus;
//
//import com.ls.fw.hadoop.client.bean.Constant;
//
//public class MyDistributedFileSystem extends DistributedFileSystem{
//
//	 private FileStatus makeQualified(HdfsFileStatus f, Path parent) {
//		    return new FileStatus(f.getLen(), f.isDir(), f.getReplication(),
//		        f.getBlockSize(), f.getModificationTime(),
//		        f.getAccessTime(),
//		        f.getPermission(), f.getOwner(), f.getGroup(),
//		        (f.getFullPath(parent)).makeQualified(
//		            getUri(), getWorkingDirectory())); // fully-qualify path
//		  }
//	 private String getPathName(Path file) {
//		    checkPath(file);
//		    String result = file.toUri().getPath();
//		    if (!DFSUtil.isValidName(result)) {
//		      throw new IllegalArgumentException("Pathname " + result + " from " +
//		                                         file+" is not a valid DFS filename.");
//		    }
//		    return result;
//		  }
//		  
//	/**
//	   * 根据分页条查询文件
//	   * @author ls 2013-9-5 下午06:08:39
//	   * @param p
//	   * @param page 第几页
//	   * @param pageSize 每页显示多少行
//	   * @return
//	   * @throws IOException
//	   */
//	  public FileStatus[] listStatus(Path p,int page,int pageSize) throws IOException {
//		    String src = getPathName(p);
//		    // fetch the first batch of entries in the directory
//		    DirectoryListing thisListing = dfs.listPaths(
//		        src, HdfsFileStatus.EMPTY_NAME);
//		    if (thisListing == null) { // the directory does not exist
//		      throw new FileNotFoundException("File " + p + " does not exist.");
//		    }
//		    HdfsFileStatus[] partialListing = thisListing.getPartialListing();
//		    if (!thisListing.hasMore()) { // got all entries of the directory
//		        //总行数
//		    	int totalNumEntries = partialListing.length;
//		        ArrayList<FileStatus> listing = null;
//		        //终止索引位置
//		        int endIndex = totalNumEntries;
//				if (page <= 0) {
//					page = 1;
//				}
//				// 起始偏移量
//				int offset = 0;
//				if(page>0&&pageSize>0){
//					 offset = pageSize * (page - 1);
//				}
//				if (pageSize > 0) {
//					endIndex = offset + pageSize;
//					listing = new ArrayList<FileStatus>(pageSize);
//				} else {
//					listing = new ArrayList<FileStatus>();
//				}
//				if (offset >= totalNumEntries) {
//					page = 1;
//					offset = 0;
//					endIndex = offset + pageSize;
//				}
//				FileStatus  fs = null;
//				for (int i = offset; (i < totalNumEntries) && (i < endIndex); i++) {
//					  HdfsFileStatus fileStatus = partialListing[i];
//					  
//					  fs = makeQualified(fileStatus, p);
//					  if(fs.isDirectory()&&fs.getPath().getName().equals(Constant.except_dirName)){
//						  endIndex++;
//						  continue;
//					  }
//					  listing.add(fs);
//				}
//		        statistics.incrementReadOps(1);
//		      return listing.toArray(new FileStatus[listing.size()]);
//		    }
//		    // The directory size is too big that it needs to fetch more
//		    // estimate the total number of entries in the directory
//		    //总行数
//		    int totalNumEntries =
//		      partialListing.length + thisListing.getRemainingEntries();
//
//	        ArrayList<FileStatus> listing = null;
//		    //终止索引位置
//		    int endIndex = totalNumEntries;
//			if (page <= 0) {
//				page = 1;
//			}
//			// 起始偏移量
//			int offset = 0;
//			if(page>0&&pageSize>0){
//				 offset = pageSize * (page - 1);
//			}
//			if (pageSize > 0) {
//				endIndex = offset + pageSize;
//				listing = new ArrayList<FileStatus>(pageSize);
//			} else {
//				listing = new ArrayList<FileStatus>();
//			}
//			if (offset >= totalNumEntries) {
//				page = 1;
//				offset = 0;
//				endIndex = offset + pageSize;
//			}
//		    int list_length = partialListing.length;
//		   /* System.out.println("list_length:"+list_length);
//		    System.out.println("page:"+page);
//		    System.out.println("totalNumEntries:"+totalNumEntries);
//		    System.out.println("offset:"+offset);
//		    System.out.println("endIndex:"+endIndex);*/
//		    FileStatus  fs = null;
//			for (int i = offset; (i < endIndex && i<list_length); i++) {
//				  HdfsFileStatus fileStatus = partialListing[i];
//				  fs = makeQualified(fileStatus, p);
//				  if(fs.isDirectory()&&fs.getPath().getName().equals(Constant.except_dirName)){
//					  endIndex++;
//					  continue;
//				  }
//				  listing.add(fs);
//			}
//		    statistics.incrementLargeReadOps(1);
//		    // now fetch more entries
//		    //目前总行数
//		    int allRow = list_length;
//		    do {
//		    	//还差多少数据
//		       int more_size = pageSize - listing.size();
//			   if (more_size<=0) {//表示不差数据了。
//				  break;
//			   }
//			  
//		      thisListing = dfs.listPaths(src, thisListing.getLastName());
//		      if (thisListing == null) { // the directory is deleted
//		        throw new FileNotFoundException("File " + p + " does not exist.");
//		      }
//		      partialListing = thisListing.getPartialListing();
//		      if(partialListing==null){
//		    	  break;
//		      }
//		      int length = partialListing.length;
//		      allRow += length;
//		      /*System.out.println("-----------");
//		      System.out.println("length:"+length);
//			  System.out.println("more_size:"+more_size);
//			  System.out.println("allrow:"+allRow);
//			  System.out.println("offset:"+offset);
//			  System.out.println("page:"+page);
//			  System.out.println("endIndex:"+endIndex);
//		     */
//		      if(more_size>=pageSize){//还差的数据等于要求的数据，表示目前还未保存任何数据。
//		    	  if(allRow>=offset){//总行数》=起始偏移量，表示有符合要求的数据，开始保存数据。
//		    		  offset = length -(allRow - offset);//重新计算起始偏移量
//		    		  endIndex = offset+ pageSize;//重新计算结束索引位置
//		    		  /*System.out.println("offset:"+offset);
//		    		  System.out.println("endIndex:"+endIndex);
//		    		 */ 
//		    		  FileStatus  fs1 = null;
//		    		  for (int i = offset;(i >=0) && (i < length) && (i < endIndex); i++) {
//						  HdfsFileStatus fileStatus = partialListing[i];
//						  fs1 = makeQualified(fileStatus, p);
//						  if(fs1.isDirectory()&&fs1.getPath().getName().equals(Constant.except_dirName)){
//							  endIndex++;
//							  continue;
//						  }
//						  listing.add(fs1);
//					  }
//		    		  if(endIndex<=length){
//		    			  break;
//		    		  }
//		    	  }
//			   }else{//前面已经保存了部分数据，现在还需要保存还差的数据
//				      FileStatus  fs1 = null;
//				      for (int i = 0; (i < length) && (i < more_size); i++) {
//						  HdfsFileStatus fileStatus = partialListing[i];
//						  fs1 = makeQualified(fileStatus, p);
//						  if(fs1.isDirectory()&&fs1.getPath().getName().equals(Constant.except_dirName)){
//							  more_size++;
//							  continue;
//						  }
//						  listing.add(fs1);
//					  }
//			   }
//		      statistics.incrementLargeReadOps(1);
//		    } while (thisListing.hasMore());
//		    return listing.toArray(new FileStatus[listing.size()]);
//	   }
//	  
//	  /**
//	   * 获取目录路径下的文件总数
//	   * @author ls 2013-9-5 下午04:55:43
//	   * @param p
//	   * @return
//	   * @throws IOException
//	   */
//	  public int getTotalNum(Path p) throws IOException {
//		    String src = getPathName(p);
//		    // fetch the first batch of entries in the directory
//		    DirectoryListing thisListing = dfs.listPaths(
//		        src, HdfsFileStatus.EMPTY_NAME);
//
//		    if (thisListing == null) { // the directory does not exist
//		      throw new FileNotFoundException("File " + p + " does not exist.");
//		    }
//		    
//		    HdfsFileStatus[] partialListing = thisListing.getPartialListing();
//		    if (!thisListing.hasMore()) { // got all entries of the directory
//		      return partialListing.length;
//		    }
//
//		    // The directory size is too big that it needs to fetch more
//		    // estimate the total number of entries in the directory
//		    int totalNumEntries =
//		      partialListing.length + thisListing.getRemainingEntries();
//		    return totalNumEntries;
//	 }
//
//}
